import axios from 'axios';
import qs from 'qs';
//设置axios的baseURL路径
axios.defaults.baseURL = '/api'
let pending = []; //声明一个数组用于存储每个ajax请求的取消函数和ajax标识
let cancelToken = axios.CancelToken;

//判断新加入的请求是否是之前存在的，如果是，则把之前的请求取消，
let removePending = (config) => {
	console.log('removePending');
	console.log(pending.length);
	for (let p in pending) {
		if (pending[p].u === config.url + '&' + config.method) { //当当前请求在数组中存在时执行函数体
			console.log('执行取消操作');
			pending[p].f(); //执行取消操作
			pending.splice(p, 1); //把这条记录从数组中移除
		}
	}
}

//取消请求列表里的所有请求
let removeAllRequest = () => {
	console.log('removeAllRequest');
	console.log(pending.length);
	for (const p in pending) {
		const element = pending[p];
		element.f();//执行取消请求操作
		pending.splice(p, 1);
	}
}

//http request 拦截器
axios.interceptors.request.use(
	config => {
		console.log('interceptors.request');
		config.headers = {
			'Content-Type': 'application/x-www-form-urlencoded'
		}
		if (config.canCancel) {
			removePending(config); //在一个ajax发送前执行一下取消操作
			config.cancelToken = new cancelToken((c) => {
				// 这里的ajax标识我是用请求地址&请求方式拼接的字符串，当然你可以选择其他的一些方式
				pending.push({ u: config.url + '&' + config.method, f: c });
			});
		}
		return config;
	},
	error => {
		return Promise.reject(error);
	}
);
//http response 拦截器
axios.interceptors.response.use(
	response => {
		console.log('interceptors.response');
		removePending(response.config);  //在一个ajax响应后再执行一下取消操作，把已经完成的请求从pending中移除
		return response;
	},
	error => {
		return Promise.reject(error)
	}
)

function axiosRequest(method, url, params, data, canCancel) {
	return axios({
		baseURL: '/api',
		method: method,
		url: url,
		params: params, // get 请求时带的参数
		data: qs.stringify(data),
		timeout: 10000,
		canCancel: canCancel,
	}).then((res) => {
		console.log('获得响应');
		console.log(res);
		return res;
	}).catch((err) => {
		console.log('请求出错');
		console.log(err);
		return Promise.reject(err);
	})
}

function axiosRequestAll(items) {
	//items中提供请求的方法，路径，参数，然后创建多个axios
	// {
	//   methed:'get',
	//   url:'url',
	//   params:{},
	//   data:{},
	// }
	let axiosArray = [];
	for (let index = 0; index < items.length; index++) {
		const element = items[index];
		let newPromise = axios({
			method: element.method,
			url: element.url,
			params: element.params,
			data: qs.stringify(element.data),
			canCancel: element.canCancel,
		})
			.then(res => {
				console.log('success')
				console.log(res);
				return res;
			})
			.catch(err => {
				console.log('error')
				console.log(err);
				return Promise.reject(err);
			})
		axiosArray.push(newPromise)
	}
	//一次性返回两个接口
	return axios.all(axiosArray).then(axios.spread(function () {
		console.log('spread success');
		console.log(arguments);
		return arguments
	})).catch(err => {
		console.log(err);
	})
}

export { removeAllRequest, axiosRequestAll, axiosRequest }